# BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  1. Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.MLA

Bidirectional Encoder Representations from Transformers.

# 跟之前工作的区别(GPT、ELMo)

  1. 跟GPT的区别是,gpt考虑的是单向的,用左边的信息预测未来的信息;而bert为双向的架构,用了左侧和右侧的信息,提升某些任务的性能,提出了MLM
  2. 跟ELMo的区别是,elmo是RNN的架构,面对下游任务需要做调整;而bert是transformer架构,比较简单,只需要改最上层就行

综合一下,RNN只有双向,但是架构差,GPT模型结构好,但是单向,因此BERT将这两点进行结合,得到了双向的Transformer结构

图1. bert预训练和微调

# INPUT

图2. bert的输入embedding

相比Transformer,调了三个参数

  • Base:层数是L=12,维度H是768,head A是12;因此总共参数为1亿
  • Large:层数是L=24,宽度H是1024,head A是16;总共参数3.4亿

Nparams=30kH+L(H28+H23+H21)N_{params} = 30k*H + L*(H^2 * 8 + H^2 * 3 + H^2 * 1)

  1. 因为有些任务比如QA是看句子的关系,因此需要句子对(Sequence),这里不一定是严格的句子,可能是一个文本块,因此文中称为sequence;Transformer的输入是一个句子对,因为编码器和解码器都需要输入对应句子
  2. 采用了WordPiece embedding。传统方法用空格作分割单词,但如果语料很大的话,导致词典特别大,如果这个很大,就导致模型整个可学习参数都在embedding层上了;wordpiece是说如果某些词出现的概率不大的话,应该将其切开,看子序列,如果其中有词根,并且词根出现概率很大,那就只保留词根,最终3w
  3. 每个句子开头是[cls],作为句子的表征,因为attention机制可以保证看到句子中的每个词,因此放在开头是ok的,另外在两个句子间放一个[sep]来区分不同句子输入,使用token type做了一个embedding

最终Embedding为 token embedding + segment embedding + position embedding

# Pre-training

(无标号的数据)

# Task1: MLM(Mask Language Model)

  • 随机选择15%的词[MASK]掉
  • 随机选择80%的词替换成其他词
  • 随机选10%什么都不做

# Task2: NSP (Next Sentence Predict)

预测上个句子是否是下个句子

# Finetune

(有标签的数据)

根据下游任务设计输入和输出,原始作者建议2-4个epoch,但是实验证明太少了,方差太大不稳定,有人建议20个epochs:*Mosbach et al even recommend fine-tunig for 20 epochs,*而且作者实验时采用的是Adam的不完全版,需要用Adam的正常版

作者用了预训练的输入做任务,跟微调的结果比差很多,因此作者建议微调使用